package net.jcip.examples.chapter8;

import java.util.concurrent.*;

import net.jcip.annotations.*;

/**
 * ValueLatch
 * <p/>
 * Result-bearing latch used by ConcurrentPuzzleSolver
 *
 * 这段代码实现了一个线程安全的 ValueLatch 类，用于在多线程环境中等待并获取一个值
 *
 * @author Brian Goetz and Tim Peierls
 */
@ThreadSafe
public class ValueLatch <T> {
    @GuardedBy("this") private T value = null;//只有持有锁（this 对象的锁）的线程才能访问或修改这个字段。
    private final CountDownLatch done = new CountDownLatch(1);

    /**
     * 使用 CountDownLatch 的 getCount() 方法来判断当前计数是否为0。如果为0，表示值已经被设置。
     */
    public boolean isSet() {
        return (done.getCount() == 0);
    }

    public synchronized void setValue(T newValue) {
        if (!isSet()) {
            value = newValue;
            done.countDown();
        }
    }

    /**
     * 调用 CountDownLatch 的 await() 方法，该方法会阻塞当前线程，直到 done 计数器减为0。
     * 一旦计数器为0（即 setValue() 方法调用了 countDown()），线程会被唤醒继续执行。获取值操作需要在同步块内，以确保多线程环境下获取到的值是正确的。
     */
    public T getValue() throws InterruptedException {
        done.await();//只有当为value 赋值之后才可以getValue
        //CountDownLatch.await  已经具有同步功能  使用synchronized 是多余的
        return value;
    }

//    public T getValue() throws InterruptedException {
//        done.await();
//        synchronized (this) {
//            return value;
//        }
//    }

}
